package com.atgugui.edumsm.service.impl;

import com.atgugui.commonutils.CheckCodeUtils;
import com.atgugui.edumsm.service.MsmService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpSession;
import java.util.concurrent.TimeUnit;

@Service
public class MsmSerciceImpl implements MsmService {

    private final static long EXPIRE = 5;

    @Autowired
    private JavaMailSender mailSender; // 注入发送邮件对象

    @Autowired
    private RedisTemplate<String, Object> redisTemplate; // 注入redsi模板，主要做验证码的过期时间

    @Value("${spring.mail.username}")
    private String from; // 注入发送者

    @Override
    public boolean sendCheckMail(String email) {
        try {
            // 判断当前验证码时候已经过了设置的过期时间
            String activeCode = (String) redisTemplate.opsForValue().get(email);
            // 如果已经存在，并且距离上一次生成的激活码的过期时间还没有到，就不会生成新的激活码，进行邮件激活
            if (!StringUtils.isEmpty(activeCode)) {
                return false;
            }
            // 过期了，或者第一次进行邮件激活注册
            String checkCode = CheckCodeUtils.GeneratorCheckCode(); // 生成激活码
            // 将激活码放置到redis缓存中，并设置过期时间  5min
            redisTemplate.opsForValue().set(email,checkCode,EXPIRE,TimeUnit.MINUTES);
            // 创建邮件对象
            SimpleMailMessage mailMessage = new SimpleMailMessage();
            // 设置邮件主题
            mailMessage.setSubject("谷粒在线教育平台注册激活邮件");
            // 设置邮件中的激活信息
            String message = CheckCodeUtils.GeneratorMailActiveCheckMessage(checkCode,EXPIRE);
            mailMessage.setText(message);
            // 设置邮件的发送者和接受者
            mailMessage.setFrom(from);
            mailMessage.setTo(email);
            // 发送邮件
            mailSender.send(mailMessage);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
